home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 422_04 / monitor.asm < prev    next >
Assembly Source File  |  1994-02-14  |  20KB  |  646 lines

  1.     TITLE    8080/8085 SYSTEM MONITOR
  2. ****************************************************************
  3. *                   8080/8085 SYSTEM MONITOR                   *
  4. *--------------------------------------------------------------*
  5. *  COMMANDS:                                                   *
  6. *    B .................... ENTER RESIDENT BASIC INTERPRETER.  *
  7. *    D .................... DOWNLOAD FROM TERMINAL PORT.       *
  8. *    G <ADR> .............. GO (EXECUTE) AT ADDRESS.           *
  9. *    L .................... LOAD MEMORY FROM TAPE.             *
  10. *    M <ADR>,<ADR> ........ DISPLAY MEMORY IN HEXIDECIMAL.     *
  11. *    R .................... REENTER RESIDENT BASIC.            *
  12. *    S <ADR> [NN]-<BYT> ... SUBSTUTE INTO MEMORY.              *
  13. *    T 'H' OR 'F' ......... TERMINAL EMULATION MODE.           *
  14. *    U <WRD> .............. REINITIALIZE 8251 UART.            *
  15. *    W <ADDR>,<ADDR> ...... WRITE MEMORY TO TAPE.              *
  16. ****************************************************************
  17.     PAGE
  18. *
  19. * CONSTANTS AND EQUATES...
  20. *
  21. DEFIO    EQU    3        DEFAULT I/O CONFIGURATION
  22. KEYBRD    EQU    0        KEYBOARD INPUT PORT
  23. UCTL    EQU    2        UART CONTROL/STATUS PORT
  24. UDAT    EQU    1        UART DATA PORT
  25. VIDEO    EQU    $1000        VIDEO DISPLAY RAM ADDRESS
  26. BUFF    EQU    $1400        INPUT BUFFER
  27. IOCON    EQU    BUFF+$FF    I/O CONFIGURATION
  28. USROUT    EQU    IOCON-2        USER OUTPUT ROUTINE VECTOR
  29. CURSOR    EQU    USROUT-2    CURRENT CURSOR POSITION
  30. LSTCHR    EQU    CURSOR-1    CHARACTER UNDER CURSOR
  31. STACK    EQU    LSTCHR        SYSTEM STACK
  32. BASIC    EQU    $400        ADDRESS OF RESIDENT BASIC INTERPRETER
  33. RENTRY    EQU    BASIC+$A3    ADDRESS TO REENTER BASIC
  34.     PAGE
  35. *
  36. * START OF MONITOR, FIRST INITIALIZE THE HARDWARE
  37. *
  38. START    LXI    SP,STACK    INITALIZE STACK
  39.     LXI    H,0        SET USRIO TO ZERO...
  40.     SHLD    USROUT        TO INDICATE IT HASN'T BEEN SET
  41.     MVI    A,DEFIO        DEFAULT I/O CONFIGURATION
  42.     STA    IOCON        SET I/O CONFIGURATION
  43.     LXI    H,$7A37        USART 7 BITS, NO PARITY, HIGH-SPEED
  44.     CALL    SETURT        INITIALIZE 8251
  45.     MVI    A,$0C        CLEAR SCREEN CHARACTER
  46.     CALL    OUT        DISPLAY
  47.     JMP    PRNT        PROMPT FOR COMMAND
  48. * GETS DOUBLE VALUE FOR HL, DE
  49. DGET    CALL    AGET        GET FIRST ADDRESS
  50.     XCHG            SWAP
  51.     MVI    A,','        GET SEPERATOR CHARACTER
  52.     CALL    OUT        DISPLAY
  53. * GETS TWO BYTE VALUE FOR H-L
  54. AGET    CALL    GETHL        GET HEX VALUE
  55.     RC            RETURN IF OK
  56. * INDICATE ERROR WITH '?' ON CONSOLE
  57. ERROR    MVI    A,'?'        ERROR MESSAGE
  58.     CALL    OUT        DISPLAY IT
  59. * RECOVER FROM ERROR, RESET STACK, SHUT TAPE OFF
  60. ABORT    LXI    SP,STACK    FIX UP STACK
  61.     CALL    TOFF        SHUT OFF TAPE
  62.     CALL    NL        NEW LINE ON TERMINAL
  63. * WAIT FOR COMMAND
  64. PRNT    MVI    A,'*'        PROMPT MESSAGE
  65.     CALL    OUT        DISPLAY
  66.     CALL    IN        GET CHARACTER FROM TERMINAL
  67.     CALL    OUT        ECHO
  68.     MOV    B,A        SAVE FOR COMPARISON
  69.     CALL    SPACE        DISPLAY SEPARATER
  70.     LXI    H,CTAB        POINT TO COMMAND TABLE
  71. CLOOK    MOV    A,M        GET CMD FROM TABLE
  72.     INX    H        POINT TO NEXT
  73.     ANA    A        TEST FOR END IF TABLE
  74.     JZ    ERROR        IF SO, INDICATE SO
  75.     MOV    E,M        GET LOW ADDRESS
  76.     INX    H        POINT TO HIGH
  77.     MOV    D,M        GET HIGH ADDRESS
  78.     INX    H        POINT TO NEXT
  79.     CMP    B        TEST FOR ENTERED COMMAND
  80.     JNZ    CLOOK        KEEP LOOKING TILL WE FIND
  81.     LXI    H,ABORT        ADDRESS TO RETURN TO
  82.     PUSH    H        SAVE RETURN ADDRESS
  83.     XCHG            SWAP TO H-L
  84.     PCHL            EXECUTE USER CODE
  85. CTAB    DB    'B'        BASIC COMMAND?
  86.     DW    BASIC        ADDRESS OF BASIC INTERPRETER
  87.     DB    'R'        TEST FOR 'REENTER'
  88.     DW    RENTRY        REENTER BASIC
  89.     DB    'D'        TEST FOR DOWNLOAD
  90.     DW    DNLD        PERFORM DOWNLOAD
  91.     DB    'L'        TEST FOR 'LOAD'
  92.     DW    LOAD        LOAD FROM TAPE
  93.     DB    'U'        TEST FOR 'UART'
  94.     DW    UART        SET UP UART
  95.     DB    'G'        TEST FOR 'GO'
  96.     DW    GO        GO EXECUTE
  97.     DB    'S'        TEST FOR 'SUB'
  98.     DW    SUBST        SUBST. MEMORY
  99.     DB    'W'        TEST FOR 'WRITE'
  100.     DW    DUMP        DUMP SOME OUT
  101.     DB    'M'        TEST FOR 'M'
  102.     DW    MEMRY        MEMORY CODE
  103.     DB    'T'        TERMINAL MODE???
  104.     DW    TMODE        IF SO, ENTER TERMINAL
  105.     DB    0        INDICATE END OF TABLE
  106. *
  107. * DISPLAY MEMORY COMMAND
  108. *
  109. MEMRY    CALL    DGET        GET ADDRESSES
  110.     XCHG            SWAP BACK
  111. MLOOP    CALL    NL        START A NEW LINE
  112.     CALL    HLOUT        DISPLAY ADDRESS
  113. ML1    CALL    SPACE        DISPLAY SPACE
  114.     MOV    A,M        GET CONTENTS
  115.     CALL    HOUT        DISPLAY HEX
  116.     CALL    CHLDE        TEST FOR END
  117.     RNC            IF SO, STOP
  118.     INX    H        NEXT BYTE
  119.     MOV    A,L        GET LOW ADDRESS
  120.     ANI    $0F        TEST FOR END OF LINE
  121.     JNZ    ML1        IF NOT, KEEP GOING
  122.     CALL    CTRLC        TEST FOR USER ABORT
  123.     JNZ    MLOOP        IF NOT, KEEP DISPLAYING
  124.     RET
  125. *
  126. * GO COMMAND
  127. *
  128. GO    CALL    AGET        GET ADDRESS TO 'GO' AT
  129.     PCHL            SET PROGRAM COUNTER
  130. *
  131. * SUBSTUTUTE COMMAND
  132. *
  133. SUBST    CALL    AGET        GET ADDRESS
  134. SUB0    CALL    NL        START ON A NEW LINE
  135.     CALL    HLOUT        DISPLAY ADDRESS
  136.     MVI    D,8        EIGHT BYTES/LINE
  137. SUB1    CALL    SPACE        SKIP A SPACE
  138.     MOV    A,M        GET CONTENTS
  139.     CALL    HOUT        DISPLAY
  140.     MVI    A,'-'        PROMPT WITH '-'
  141.     CALL    OUT        DISPLAY
  142.     CALL    GETBYT        GET BYTE
  143.     JC    SUB3        IF OK, SUBSTUTE
  144.     CPI    $0D        TEST FOR ABORT
  145.     RZ            IF SO, BACK FOR COMMAND
  146.     CALL    SPACE        OTHERWISE, PRINT.
  147.     CALL    SPACE        TWO SPACES (SAME SPACE AS HEX DIGITS)
  148.     MOV    A,M        GET OLD BYTE BACK
  149. SUB3    MOV    M,A        REPLACE MEMORY CONTENTS
  150. SNXT    INX    H        NEXT LOCATION IN MEMORY
  151.     DCR    D        REDUCE COUNT OF BYTES/LINE
  152.     JNZ    SUB1        IF OK, STAY ON SAME LINE
  153.     JMP    SUB0        OTHERWISE GO TO NEW LINE
  154. *
  155. * DUMP COMMAND
  156. *
  157. DUMP    CALL    DGET        GET ADDRESSES
  158. * DE=START ADDRESS, H-L=END ADDRESS
  159. DUMP1    INX    H        ADVANCE BY ONE BYTE
  160.     MOV    A,H        TEST FOR SPECIAL CASE
  161.     ANA    A        IF ZERO PAGE
  162.     JZ    LBOT        IF SO, SPECIAL CASE
  163.     PUSH    H        SAVE ENDING VALUE
  164.     LXI    B,$FF01        GET VALUE TO SUBTRACT
  165.     DAD    B        SUBTRACT FROM ENDING ADDRESS
  166.     XCHG            SWAP BACK
  167.     CALL    TON        START TAPE DRIVE
  168. DRECL    CALL    CHLDE        SEE IF WE HAVE FINISHED YET
  169.     JNC    LREC        IF SO, LAST RECORD
  170.     MVI    A,$FF        OTHERWISE, RECORD LENGTH IS 255
  171.     CALL    DUMPR        DUMP OUT RECORD
  172.     JMP    DRECL        KEEP GOING TILL LAST RECORD
  173. LREC    POP    D        GET ADDRES BACK
  174.     XCHG            SWAP
  175. LBOT    PUSH    D        GET ADDRESS BACK
  176.     MOV    A,D        TAKE.
  177.     CMA            TWO'S.
  178.     MOV    D,A        COMPLEMENT.
  179.     MOV    A,E        SO WE CAN.
  180.     CMA            SUBTRACT.
  181.     MOV    E,A        FROM THE
  182.     INX    D        ORIGIONAL ADDRESS
  183.     DAD    D        SUBTRACT
  184.     MOV    A,L        GET LENGTH
  185.     POP    H        GET ADDRESS BACK
  186.     CALL    DUMPR        DUMP LAST RECORD
  187.     SUB    A        END OF FILE INDICATOR
  188. *
  189. * DUMPS A RECORD IN INTEL HEX FORMAT
  190. *
  191. DUMPR    MOV    B,A        SAVE LENGTH IN B
  192.     MVI    A,4        SET FOR UART OUTPUT
  193.     STA    IOCON        SET I/O CONF
  194.     CALL    NL        DISPLAY LF CR TO TAPE
  195.     MVI    A,':'        START OF RECORD
  196.     CALL    OUT        WRITE TO TABE
  197.     MOV    A,B        GET LENGTH
  198.     MOV    C,A        START CHECKSUM
  199.     CALL    HOUT        WRITE LENGTH TO TAPE
  200.     MOV    A,B        GET LENGTH BACK
  201.     ANA    A        TEST FOR END OF FILE
  202.     JZ    ENDMP        IF SO, STOP
  203.     CALL    HLOUT        WRITE ADDRESS TO TAPE
  204.     MOV    A,C        GET CHECKSUM
  205.     ADD    H        ADD HIGH ADDRESS
  206.     ADD    L        ADD LOW ADDRESS
  207.     MOV    C,A        RESAVE CHECKSUM
  208.     SUB    A        DATA TYPE ZERO
  209.     CALL    HOUT        WRITE TO TAPE
  210. MHEX    MOV    A,M        GET BYTE OF DATA TO DUMP
  211.     CALL    HOUT        WRITE TO TAPE
  212.     MOV    A,M        GET DATA BACK
  213.     ADD    C        ADD TO CHECKSUM
  214.     MOV    C,A        RESAVE CHECKSUM
  215.     INX    H        NEXT MEMORY LOCATION
  216.     DCR    B        REDUCE LENGTH
  217.     JNZ    MHEX        IF NOT END, KEEP DUMPING
  218.     CMA            INVERT TO MAKE.
  219.     INR    A        TWO'S COMPLEMENT CHECKSUM
  220.     CALL    HOUT        WRITE CHECKSUM TO TAPE
  221. ENDMP    MVI    A,DEFIO        GET DEFAULT I/O CONF
  222.     STA    IOCON        RESET I/O CONFIGURATION
  223.     RET
  224. *
  225. * COMPARE'S H-L WITH D-E
  226. *
  227. CHLDE    MOV    A,H        GET HIGH IF HL
  228.     CMP    D        TEST WITH HIGH OF DE
  229.     RNZ            IF NOT SAME, PROBLEM SOLVED
  230.     MOV    A,L        GET LOW HL
  231.     CMP    E        SET FLAGS FOR COMPARE WITH LOW DE
  232.     RET
  233. * DISPLAYS A SPACE ON THE TERMINAL
  234. SPACE    MVI    A,' '        GET A SPACE
  235.     JMP    OUT        DISPLAY
  236. *
  237. * DISPLAYS 16 BIT VALUE OF H-L ON THE TERMINAL
  238. *
  239. HLOUT    MOV    A,H        GET H
  240.     CALL    HOUT        DISPLAY H IN HEX
  241.     MOV    A,L        GET L
  242. * DISPLYS 8 BIT VALUE OF ACC IN HEX
  243. HOUT    PUSH    PSW        SAVE LOW DIGIT
  244.     RRC            MAKE HIGH.
  245.     RRC            DIGIT.
  246.     RRC            INTO.
  247.     RRC            LOW DIGIT.
  248.     CALL    HXOUT        PRINT HIGH DIGIT
  249.     POP    PSW        GET LOW DIGIT BACK
  250. HXOUT    ANI    $0F        GET RID OF EXCESS BAGGAGE
  251.     ADI    $30        CONVERT TO ASCII NUMBER
  252.     CPI    $3A        TEST FOR ALPHA CHARACTER
  253.     JC    OUT        IF NOT, WE ARE OK
  254.     ADI    7        CONVERT TO CHARACTER
  255. *
  256. * OUTPUT ROUTINE, DISPLAYS CONTENTS OF ACC ON ALL ENABLED
  257. * OUTPUT DEVICES
  258. *
  259. OUT    PUSH    B        SAVE B-C PAIR
  260.     PUSH    D        SAVE D-E PAIR
  261.     PUSH    H        SAVE H-L PAIR
  262.     MOV    B,A        SAVE CHARACTER IN B
  263.     LDA    IOCON        GET I/O CONFIGURATION
  264.     MOV    C,A        SAVE IN C
  265.     ANI    $40        TEST FOR OUTPUT DISABLED
  266.     JNZ    OEXIT        IF SO, ABORT
  267.     MOV    A,C        GET CONFIGURATION BACK
  268.     ANI    2        TEST FOR VIDEO DISPLAY ENABLED
  269.     JZ    OURT        NO, TRY UART
  270. * OUTPUT TO VIDEO DISPLAY
  271. OVID    LHLD    CURSOR        GET CURSOR POSITION
  272.     LDA    LSTCHR        GET CHARACTER UNDER CURSOR
  273.     MOV    M,A        REPLACE CURSOR
  274.     MOV    A,B        GET CHARACTER TO PRINT
  275.     CPI    13        TEST FOR CR
  276.     JZ    CR        ADVANCE TO NEXT LINE
  277.     CPI    10